package com.github.bitsapling.sapling.utils;

import com.github.bitsapling.sapling.entity.Comment;
import com.github.bitsapling.sapling.entity.Post;
import com.github.bitsapling.sapling.entity.Thumbup;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 数据转换工具类
 * 用于将后端实体对象转换为前端期望的格式
 */
public class DataConverter {

    /**
     * 将Note对象转换为前端期望的帖子格式
     *
     * @param note Note实体对象
     * @return 转换后的Map对象
     */
    public static Map<String, Object> convertNoteToPost(Post note) {
        if (note == null) {
            return null;
        }

        Map<String, Object> post = new HashMap<>();
        post.put("id", note.getId().toString());
        post.put("title", note.getTitle());
        post.put("content", note.getContent());


        // 设置标签（从内容中提取关键词作为标签，实际应该有专门的标签表）
        List<String> tags = extractTagsFromContent(note.getContent());
        post.put("tags", tags);

        // 设置创建时间
        if (note.getCreateTime() != null) {
            post.put("createdAt", formatTimestamp(note.getCreateTime()));
        }


        // 设置是否置顶
        post.put("isPinned", note.getIsPinned());

        // 设置作者信息
        Map<String, Object> author = getUserInfoById(note.getUserId(),note.getCreatedBy());
        post.put("author", author);

        return post;
    }

    /**
     * 将Comment对象转换为前端期望的评论格式
     *
     * @param comment Comment实体对象
     * @return 转换后的Map对象
     */
    public static Map<String, Object> convertCommentToFrontend(Comment comment) {
        if (comment == null) {
            return null;
        }

        Map<String, Object> result = new HashMap<>();
        result.put("id", comment.getId().toString());
        result.put("content", comment.getContent());

        // 设置创建时间
        if (comment.getCreateTime() != null) {
            result.put("createdAt", formatTimestamp(comment.getCreateTime()));
        }

        // 设置用户信息
        Map<String, Object> user = getUserInfoById(comment.getUserId(),comment.getCreatedBy());
        result.put("user", user);

        return result;
    }

    /**
     * 将Thumbup对象转换为前端期望的点赞格式
     *
     * @param thumbup Thumbup实体对象
     * @return 转换后的Map对象
     */
    public static Map<String, Object> convertThumbupToFrontend(Thumbup thumbup) {
        if (thumbup == null) {
            return null;
        }

        Map<String, Object> result = new HashMap<>();
        result.put("id", thumbup.getId().toString());
        result.put("noteId", thumbup.getNoteId().toString());
        result.put("userId", thumbup.getUserId().toString());

        // 设置创建时间
        if (thumbup.getCreateTime() != null) {
            result.put("createdAt", formatTimestamp(thumbup.getCreateTime()));
        }

        return result;
    }

    /**
     * 格式化时间戳为ISO 8601格式
     *
     * @param timestamp 时间戳
     * @return 格式化后的时间字符串
     */
    private static String formatTimestamp(LocalDateTime timestamp) {
        if (timestamp == null) {
            return null;
        }

        DateTimeFormatter formatter = DateTimeFormatter
                .ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")
                .withZone(ZoneOffset.UTC);

        return timestamp.format(formatter);
    }


    /**
     * 从内容中提取标签
     * 实际应该有专门的标签表，这里简化处理
     *
     * @param content 内容
     * @return 标签列表
     */
    private static List<String> extractTagsFromContent(String content) {
        if (content == null || content.isEmpty()) {
            return Collections.emptyList();
        }

        // 简单实现：提取内容中的#标签
        List<String> tags = new ArrayList<>();

        // 查找内容中的常见游戏名称作为标签
        String[] commonGames = {"上古卷轴", "赛博朋克", "巫师", "辐射", "GTA", "怪物猎人", "艾尔登法环", "星空"};
        for (String game : commonGames) {
            if (content.contains(game)) {
                tags.add(game);
            }
        }

        // 如果没有找到标签，添加一个默认标签
        if (tags.isEmpty()) {
            tags.add("讨论");
        }

        return tags;
    }

    /**
     * 根据用户ID获取用户信息
     * 实际应该从数据库中查询，这里简化处理
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    private static Map<String, Object> getUserInfoById(Long userId,String username) {
        Map<String, Object> user = new HashMap<>();

        // 默认用户信息
        user.put("id", userId != null ? userId.toString() : "unknown");
        user.put("name", username );

        return user;
    }
}

